package com.fdb.efp.nls.service.impl;

import com.alibaba.fastjson.JSONObject;
import com.fdb.basic.framework.core.base.FrameworkService;
import com.fdb.basic.framework.core.constant.BaseConstant;
import com.fdb.basic.framework.core.constant.MonAlrmLvlEnums.MonAlrmLvlEnum;
import com.fdb.basic.framework.core.exception.ESBException;
import com.fdb.basic.framework.core.util.*;
import com.fdb.basic.sequence.service.facade.SequenceService;
import com.fdb.efp.nls.service.facade.CtrLoanContService;
import com.fdb.efp.nls.service.vo.CtrLoanContVO;
import com.fdb.efp.cus.service.facade.CusIndivService;
import com.fdb.efp.cus.service.vo.CusIndivVO;
import com.fdb.efp.nls.service.vo.CfcaSignInfoVO;
import com.fdb.efp.nls.service.vo.LogErrorInfoVO;
import com.fdb.efp.nls.service.facade.CfcaSignInfoService;
import com.fdb.efp.nls.service.facade.ElectronicSignPolyService;
import com.fdb.efp.nls.service.facade.LogErrorInfoService;
import com.fdb.efp.esb.common.constant.ElectronicSignatureConstant;
import com.fdb.efp.esb.common.constant.ElectronicSignatureEnums;
import com.fdb.efp.esb.common.constant.InstitutionEnums;
import com.fdb.efp.esb.common.constant.nls.NlsProdCdEnum;
import com.fdb.efp.esb.service.bo.req.dzqz.ReqElectronicSignature3001Bean;
import com.fdb.efp.esb.service.bo.req.dzqz.ReqElectronicSignature3201Bean;
import com.fdb.efp.esb.service.bo.req.dzqz.ReqElectronicSignature3203Bean;
import com.fdb.efp.esb.service.bo.req.dzqz.ReqElectronicSignatureDL01Bean;
import com.fdb.efp.esb.service.bo.resp.dzqz.RspElectronicSignature3001Bean;
import com.fdb.efp.esb.service.bo.resp.dzqz.RspElectronicSignature3201Bean;
import com.fdb.efp.esb.service.bo.resp.dzqz.RspElectronicSignature3203Bean;
import com.fdb.efp.esb.service.bo.resp.dzqz.RspElectronicSignatureDL01Bean;
import com.fdb.efp.esb.service.bo.resp.dzqz.info.ElectronicSignature3203Signatory;
import com.fdb.efp.esb.service.facade.dzqz.ElectronicSignatureService;
import com.fdb.efp.nls.service.vo.NlsApplyInfoVO;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Service;

import java.io.File;
import java.io.IOException;
import java.text.ParseException;
import java.util.List;
import java.util.Map;
import java.util.Objects;

/**
 * 
 * @description:电子签章整合
 * @date:2018年12月25日 上午11:04:07
 * @author:ludayong
 */
@Service("electronicSignPolyService")
public class ElectronicSignPolyServiceImpl implements FrameworkService, ElectronicSignPolyService {

	private static Logger logger = LoggerFactory.getLogger(ElectronicSignPolyServiceImpl.class);

	// @Value("${analysis.bakImageFilePath}")
	// private String bakImageFilePath;// 影像文件备份路径

	@Autowired
	@Qualifier("electronicSignatureService")
	private ElectronicSignatureService electronicSignatureService;// 电子签章原子服务

	@Autowired
	@Qualifier("ctrLoanContService")
	private CtrLoanContService ctrLoanContService;// 贷款合同

	@Autowired
	@Qualifier("cusIndivService")
	private CusIndivService cusIndivService;// 客户中心

	@Autowired
	@Qualifier("cfcaSignInfoService")
	private CfcaSignInfoService cfcaSignInfoService;// CFCA签署信息

	@Autowired
	@Qualifier("logErrorInfoService")
	private LogErrorInfoService logErrorInfoService;// 异常信息表

	@Autowired
//	@Qualifier("dbSeqService")
	private SequenceService sequenceService;// sequence服务

	/** 第一个签署人序号 */
	private final int THE_FIRST_SIGN_INFO = 0;

	/**
	 * 
	 * @description:电子签章处理
	 * @param param
	 * @return
	 * @date:2018年12月15日 上午11:00:47
	 * @author:ludayong,caoxin 0.2设置CFCA签署状态和签署信息 改为获取响应报文的个人签署信息数组中第一个值
	 * @throws ESBException
	 */
	public boolean handleElectronicSignPoly(Map<String, Object> param) throws ESBException {
		boolean result = false;
		String retCode = null;// 返回成功代码
		try {
			String tranCode = (String) param.get("tranCode");// 交易代码（接口代码）
			String opnFlg = (String) param.get("opnFlg");// 开户标识
			NlsApplyInfoVO nlsApplyInfoVO = (NlsApplyInfoVO) param.get("nlsApplyInfoVO");// 网贷申请基本信息
			CtrLoanContVO ctrLoanContVo = (CtrLoanContVO) param.get("ctrLoanContVo");//
			String imageType = "";
			try {
				imageType = (String) param.get("imageType");// 影像类型
			} catch (Exception e) {
			}

			String applySeq = nlsApplyInfoVO.getApplySeq();// 申请流水号

			String currentTime = DateTool.getCurrentDateTime();// 当前时间
			LogErrorInfoVO logErrorInfoVo = new LogErrorInfoVO();
			logErrorInfoVo.setApplySeq(applySeq);// 申请流水号
			logErrorInfoVo.setSerno(UUIDUtil.getUUID());// 主键
			logErrorInfoVo.setState(ElectronicSignatureEnums.YesNoEnum.NO.VALUE);// 未处理
			logErrorInfoVo.setCreateTime(currentTime);// 创建时间
			logErrorInfoVo.setLastModifyTime(currentTime);// 最后修改时间

			ReqElectronicSignature3001Bean req3001Bean = (ReqElectronicSignature3001Bean) param.get("req3001Bean");// 个人开户3001请求信息
			ReqElectronicSignature3201Bean req3201Bean = (ReqElectronicSignature3201Bean) param.get("req3201Bean");// 创建合同3201请求信息
			ReqElectronicSignature3203Bean req3203Bean = (ReqElectronicSignature3203Bean) param.get("req3203Bean");// 上传合同3203请求信息
			ReqElectronicSignatureDL01Bean reqCADL01Bean = (ReqElectronicSignatureDL01Bean) param.get("reqCADL01Bean");// 合同下载DL01请求信息

			CusIndivVO cusIndivVo = new CusIndivVO();// 客户信息
			cusIndivVo.setCusId(nlsApplyInfoVO.getCusId());// 客户编号
			CusIndivVO queryCusIndivVO = new CusIndivVO();//cusIndivService.queryByPk(cusIndivVo);

			String userId = null;// 个人开户信息：用户ID
//			@author:liuty
//			@date:2019/10/17
//			涉及产品:税e贷
//			原因:注释相关方法后关联报错，因此注释
//			try {
//				Objects.requireNonNull(queryCusIndivVO);// 客户信息不为空
//			} catch (Exception e) {
//				e.printStackTrace();
//				logErrorInfoVo.setErrorMsg(e.getMessage());// 异常信息
//				logErrorInfoVo.setRemark("客户信息为空！");// 备注
//				logErrorInfoVo.setErrorType(MonAlrmLvlEnum.SERIOUS.getEnname());// 错误级别
//				logErrorInfoVo.setSerno(UUIDUtil.getUUID());// 主键
//				logErrorInfoService.insertLogErrorInfo(logErrorInfoVo);// 记录异常信息
//				throw new ESBException("客户信息：" + e.getMessage());
//			}

			if (Objects.nonNull(queryCusIndivVO) && !StringUtil.isNullorBank(queryCusIndivVO.getAxqUsrId())) {
				userId = queryCusIndivVO.getAxqUsrId();
			}
			// 需要开户，开户前查询是否已经在安心签开过户
			if (ElectronicSignatureEnums.YesNoEnum.YES.VALUE.equals(opnFlg) && StringUtil.isNullorBank(userId)) {
				// 电子签章处理：个人开户
				RspElectronicSignature3001Bean rsp3001Bean = null;
				try {
					rsp3001Bean = electronicSignatureService.electronicSignaturePerOpenAccount(req3001Bean);
				} catch (Exception e) {
					logErrorInfoVo.setErrorMsg(e.getMessage());// 异常信息
					logErrorInfoVo.setRemark("电子签章处理个人开户出现异常！");// 备注
					logErrorInfoVo.setErrorType(MonAlrmLvlEnum.SERIOUS.getEnname());// 错误级别
					logErrorInfoVo.setSerno(UUIDUtil.getUUID());// 主键
					logErrorInfoService.insertLogErrorInfo(logErrorInfoVo);// 记录异常信息
					throw new ESBException("电子签章处理个人开户出现异常：" + e.getMessage());
				}
				// 响应信息不为空
				Objects.requireNonNull(rsp3001Bean);

				if (ElectronicSignatureEnums.RetCodeEnum.SUCCESS.VALUE.equals(rsp3001Bean.getRetStCd())) {// 开户成功

					retCode = rsp3001Bean.getRetStCd();// 个人开户信息响应码
					userId = rsp3001Bean.getPerson().getUsrID();// 个人开户信息：用户ID
					// 更新客户信息
					cusIndivVo.setCusId(nlsApplyInfoVO.getCusId());// 客户编号
					cusIndivVo.setAxqUsrId(rsp3001Bean.getPerson().getUsrID());// 安心签开户号
					logger.info("电子签章操作更新客户信息：" + JSONObject.toJSONString(cusIndivVo));
					int num = cusIndivService.updateByPk(cusIndivVo);
					logger.info("电子签章操作更新客户信息数目：" + JSONObject.toJSONString(num));
				} else {
					logErrorInfoVo.setErrorMsg(rsp3001Bean.getRtnMsg());// 异常信息
					logErrorInfoVo.setRemark("电子签章处理个人开户出现异常！");// 备注
					logErrorInfoVo.setErrorType(MonAlrmLvlEnum.SERIOUS.getEnname());// 错误级别
					logErrorInfoVo.setSerno(UUIDUtil.getUUID());// 主键
					logErrorInfoService.insertLogErrorInfo(logErrorInfoVo);// 记录异常信息

					// 个人开户信息响应码
					retCode = ElectronicSignatureEnums.RetCodeEnum.FAILURE.VALUE;
					// 个人开户异常信息
					logger.error("电子签章个人开户出错，异常信息：" + rsp3001Bean.getRtnMsg());
				}
			} else {
				retCode = ElectronicSignatureEnums.RetCodeEnum.SUCCESS.VALUE;
			}

			// 通过合同号查询是否已完成签署，如有则下载合同
			String contractNo = null;// 创建或上传合同签署：合同编号

			CfcaSignInfoVO inCfcaSignInfoVO = new CfcaSignInfoVO();
			inCfcaSignInfoVO.setApplySeq(applySeq);// 申请流水号
			if (!StringUtil.isNullorBank(imageType)) {
				inCfcaSignInfoVO.setApplySeq(String.valueOf(imageType) + applySeq);// 申请流水号
			}
			CfcaSignInfoVO queryCfcaSignInfoVO = cfcaSignInfoService.queryByPk(inCfcaSignInfoVO);// 根据申请流水号查询安心签签署信息

			boolean signFlg = true;// 是否需要签署合同
			// 权益转让书文件
			if (!StringUtil.isNullorBank(imageType) && !Objects.isNull(queryCfcaSignInfoVO)
					&& ElectronicSignatureEnums.CfcaContractStateEnum.CHANGE_FINISHED.getEnname()
							.equals(queryCfcaSignInfoVO.getCfcaSignState())) {
				signFlg = false;
				contractNo = queryCfcaSignInfoVO.getCfcaContNo();// 合同签署：合同编号
				reqCADL01Bean.setContrNo(contractNo);// 合同下载：合同编号
			} else if (!Objects.isNull(queryCfcaSignInfoVO)
					&& ElectronicSignatureEnums.CfcaContractStateEnum.CHANGE_FINISHED.getEnname()
							.equals(queryCfcaSignInfoVO.getCfcaSignState())
					&& ElectronicSignatureConstant.CONT_STATUS_200.equals(ctrLoanContVo.getContState())) {// 当前合同已经签署成功，直接下载对应的合同
				signFlg = false;
				contractNo = queryCfcaSignInfoVO.getCfcaContNo();// 合同签署：合同编号
				reqCADL01Bean.setContrNo(contractNo);// 合同下载：合同编号
			}
			if (signFlg && ElectronicSignatureEnums.RetCodeEnum.SUCCESS.VALUE.equals(retCode)
					&& ElectronicSignatureConstant.TRAN_CODE_3201.equals(tranCode)) {// 创建合同签署
				if (!StringUtil.isNullorBank(userId) && !Objects.isNull(req3201Bean.getCreateContract().getSignBscInfArry())
						&& req3201Bean.getCreateContract().getSignBscInfArry().size() >= 2) {// 注意：合同签署签章信息第二个为个人信息
					req3201Bean.getCreateContract().getSignBscInfArry().get(1).setUsrID(userId);// 创建合同签署：用户ID
				}
				RspElectronicSignature3201Bean rsp3201Bean = null;
				try {
					rsp3201Bean = electronicSignatureService.electronicSignatureSignCreateContract(req3201Bean);// 电子签章处理：创建合同签署
				} catch (Exception e) {
					logErrorInfoVo.setErrorMsg(e.getMessage());// 异常信息
					logErrorInfoVo.setRemark("电子签章处理创建合同签署出现异常！");// 备注
					logErrorInfoVo.setErrorType(MonAlrmLvlEnum.SERIOUS.getEnname());// 错误级别
					logErrorInfoVo.setSerno(UUIDUtil.getUUID());// 主键
					logErrorInfoService.insertLogErrorInfo(logErrorInfoVo);// 记录异常信息
					throw new ESBException("电子签章处理创建合同签署出现异常：" + e.getMessage());
				}

				Objects.requireNonNull(rsp3201Bean);// 响应信息不为空
				if (ElectronicSignatureEnums.RetCodeEnum.SUCCESS.VALUE.equals(rsp3201Bean.getRetStCd())) {// 创建合同签署成功
					retCode = rsp3201Bean.getRetStCd();// 创建合同签署响应码
					contractNo = rsp3201Bean.getContract().getContrNo();// 创建合同签署：合同编号
					reqCADL01Bean.setContrNo(contractNo);// 合同下载：合同编号

					// 保存安心签数据
					if (ctrLoanContVo != null) {
						inCfcaSignInfoVO.setContNo(ctrLoanContVo.getContNo());// 贷款合同号
					}
					inCfcaSignInfoVO.setCfcaContNo(rsp3201Bean.getContract().getContrNo());// 安心签合同号
					// caoxin: 设置CFCA【签署状态】和【签署信息】
					// 获取签署人信息数组
					List<ElectronicSignature3203Signatory> signInfoArry = rsp3201Bean.getContract().getContractSignInfArry();
					ElectronicSignature3203Signatory signInfo = Objects.isNull(signInfoArry) ? null : signInfoArry.get(THE_FIRST_SIGN_INFO);
					// cfca签署状态
					inCfcaSignInfoVO.setCfcaSignState(Objects.isNull(signInfo) ? "" : signInfo.getSignSt());
					// cfca签署时间
					try {
						inCfcaSignInfoVO.setCfcaSignTime(
								Objects.isNull(signInfo) ? "" : DateTool.getDateTimeStr(DateTool.parseDateTime(signInfo.getSignTm())));
					} catch (ParseException e) {
						inCfcaSignInfoVO.setCfcaSignTime(Objects.isNull(signInfo) ? "" : signInfo.getSignTm());
					}
					inCfcaSignInfoVO.setPrdId(nlsApplyInfoVO.getPrdId());// 产品id
					inCfcaSignInfoVO.setPrdCode(nlsApplyInfoVO.getPrdCode());// 产品代码
					inCfcaSignInfoVO.setPrdName(nlsApplyInfoVO.getPrdName());// 产品名称
					inCfcaSignInfoVO.setCusId(nlsApplyInfoVO.getCusId());// 客户号
					inCfcaSignInfoVO.setCusName(nlsApplyInfoVO.getCusName());// 客户名称
					// add by ludayong 2019/11/15 【数据权限】增加业务经办人,业务经办机构,创建人，创建时间赋值
					inCfcaSignInfoVO = setCfcaSignInfo(inCfcaSignInfoVO,nlsApplyInfoVO.getPrdId());

					logger.info("电子签章操作保存安心签数据信息：" + JSONObject.toJSONString(inCfcaSignInfoVO));
					CfcaSignInfoVO cfcaSignInfoDetailVO = cfcaSignInfoService.queryByPk(inCfcaSignInfoVO);
					int num = 0;
					if (cfcaSignInfoDetailVO != null) {
						// add by ludayong 2019/11/15 【数据权限】增加最后更新人，最后更新时间赋值
						inCfcaSignInfoVO = setCfcaSignInfo(inCfcaSignInfoVO);
						num = cfcaSignInfoService.updateByPk(inCfcaSignInfoVO);
					} else {
						num = cfcaSignInfoService.insertCfcaSignInfo(inCfcaSignInfoVO);
					}
					logger.info("电子签章操作保存安心签数据数目：" + JSONObject.toJSONString(num));
					if(num != 1){
                        String remark = "签章完成保存安心签数据失败！";
                        // 记录异常信息
                        recordLogErrorInfo(applySeq, remark, "", MonAlrmLvlEnum.SERIOUS.getEnname());
						logger.error(remark);
						throw new ESBException(remark);
					}
				} else {
					logErrorInfoVo.setErrorMsg(rsp3201Bean.getRtnMsg());// 异常信息
					logErrorInfoVo.setRemark("电子签章处理创建合同签署出现异常！");// 备注
					logErrorInfoVo.setErrorType(MonAlrmLvlEnum.SERIOUS.getEnname());// 错误级别
					logErrorInfoVo.setSerno(UUIDUtil.getUUID());// 主键
					logErrorInfoService.insertLogErrorInfo(logErrorInfoVo);// 记录异常信息
					// 创建合同签署信息响应码
					retCode = ElectronicSignatureEnums.RetCodeEnum.FAILURE.VALUE;
					// 创建合同签署异常信息
					logger.error("创建合同签署出错，异常信息：" + rsp3201Bean.getRtnMsg());
				}
			} else if (signFlg && ElectronicSignatureEnums.RetCodeEnum.SUCCESS.VALUE.equals(retCode)
					&& ElectronicSignatureConstant.TRAN_CODE_3203.equals(tranCode)) {// 上传合同签署
				String imageFilePath2 = (String) param.get("imageFilePath");// 合同文件路径
				String contrFlStrm = contractFileToStrByte(imageFilePath2);// 合同转base64字符
				if (!StringUtil.isNullorBank(contrFlStrm)) {// 转换成功
					req3203Bean.setContrFlStrm(contrFlStrm);
				}

				if (!StringUtil.isNullorBank(userId) && !Objects.isNull(req3203Bean.getUploadContract().getSignBscInfArry())
						&& req3203Bean.getUploadContract().getSignBscInfArry().size() > 0) {// 注意：合同签署签章个人信息
					req3203Bean.getUploadContract().getSignBscInfArry().get(0).setUsrID(userId);// 创建合同签署：用户ID
				}
				RspElectronicSignature3203Bean rsp3203Bean = null;
				try {
					rsp3203Bean = electronicSignatureService.electronicSignatureSignUpContract(req3203Bean);// 电子签章处理：上传合同签署
				} catch (Exception e) {
					logErrorInfoVo.setErrorMsg(e.getMessage());// 异常信息
					logErrorInfoVo.setRemark("电子签章处理上传合同签署出现异常！");// 备注
					logErrorInfoVo.setErrorType(MonAlrmLvlEnum.SERIOUS.getEnname());// 错误级别
					logErrorInfoVo.setSerno(UUIDUtil.getUUID());// 主键
					logErrorInfoService.insertLogErrorInfo(logErrorInfoVo);// 记录异常信息
					throw new ESBException("电子签章处理上传合同签署出现异常：" + e.getMessage());
				}

				if (ElectronicSignatureEnums.RetCodeEnum.SUCCESS.VALUE.equals(rsp3203Bean.getRetStCd())) {// 上传合同签署
					retCode = rsp3203Bean.getRetStCd();// 上传合同签署响应码
					contractNo = rsp3203Bean.getContract().getContrNo();// 上传合同签署：合同编号
					reqCADL01Bean.setContrNo(contractNo);// 合同下载：合同编号

					// 保存安心签数据
					if (ctrLoanContVo != null) {
						inCfcaSignInfoVO.setContNo(ctrLoanContVo.getContNo());// 贷款合同号
					} else if (!StringUtil.isNullorBank(imageType)) {
						inCfcaSignInfoVO.setContNo(applySeq);// 贷款合同号
					}
					inCfcaSignInfoVO.setCfcaContNo(rsp3203Bean.getContract().getContrNo());// 安心签合同号
					// 获取签署人信息数组
					List<ElectronicSignature3203Signatory> signInfoArry = rsp3203Bean.getContract().getContractSignInfArry();
					ElectronicSignature3203Signatory signInfo = Objects.isNull(signInfoArry) ? null : signInfoArry.get(THE_FIRST_SIGN_INFO);
					// caoxin:cfca签署状态
					inCfcaSignInfoVO.setCfcaSignState(Objects.isNull(signInfo) ? "" : signInfo.getSignSt());
					// caoxin:cfca签署时间
					try {
						inCfcaSignInfoVO.setCfcaSignTime(
								Objects.isNull(signInfo) ? "" : DateTool.getDateTimeStr(DateTool.parseDateTime(signInfo.getSignTm())));
					} catch (ParseException e) {
						inCfcaSignInfoVO.setCfcaSignTime(Objects.isNull(signInfo) ? "" : signInfo.getSignTm());
					}
					inCfcaSignInfoVO.setPrdId(nlsApplyInfoVO.getPrdId());// 产品id
					inCfcaSignInfoVO.setPrdCode(nlsApplyInfoVO.getPrdCode());// 产品代码
					inCfcaSignInfoVO.setPrdName(nlsApplyInfoVO.getPrdName());// 产品名称
					inCfcaSignInfoVO.setCusId(nlsApplyInfoVO.getCusId());// 客户号
					inCfcaSignInfoVO.setCusName(nlsApplyInfoVO.getCusName());// 客户名称
					// add by ludayong 2019/11/15 【数据权限】增加业务经办人,业务经办机构,创建人，创建时间赋值
					inCfcaSignInfoVO = setCfcaSignInfo(inCfcaSignInfoVO,nlsApplyInfoVO.getPrdId());

					logger.info("电子签章操作保存安心签数据信息：" + JSONObject.toJSONString(inCfcaSignInfoVO));
					CfcaSignInfoVO cfcaSignInfoDetailVO = cfcaSignInfoService.queryByPk(inCfcaSignInfoVO);
					int num = 0;
					if (cfcaSignInfoDetailVO != null) {
						// add by ludayong 2019/11/15 【数据权限】增加最后更新人，最后更新时间赋值
						inCfcaSignInfoVO = setCfcaSignInfo(inCfcaSignInfoVO);
						num = cfcaSignInfoService.updateByPk(inCfcaSignInfoVO);
					} else {
						num = cfcaSignInfoService.insertCfcaSignInfo(inCfcaSignInfoVO);
					}
					logger.info("电子签章操作保存安心签数据数目：" + JSONObject.toJSONString(num));
					if(num != 1){
                        String remark = "签章完成保存安心签数据失败！";
                        // 记录异常信息
                        recordLogErrorInfo(applySeq, remark, "", MonAlrmLvlEnum.SERIOUS.getEnname());
                        logger.error(remark);
						throw new ESBException(remark);
					}
				} else {
					logErrorInfoVo.setErrorMsg(rsp3203Bean.getRtnMsg());// 异常信息
					logErrorInfoVo.setRemark("电子签章处理上传合同签署出现异常！");// 备注
					logErrorInfoVo.setErrorType(MonAlrmLvlEnum.SERIOUS.getEnname());// 错误级别
					logErrorInfoVo.setSerno(UUIDUtil.getUUID());// 主键
					logErrorInfoService.insertLogErrorInfo(logErrorInfoVo);// 记录异常信息
					// 上传合同签署信息响应码
					retCode = ElectronicSignatureEnums.RetCodeEnum.FAILURE.VALUE;
					// 上传合同签署异常信息
					logger.error("上传合同签署出错，异常信息：" + rsp3203Bean.getRtnMsg());
					throw new ESBException("上传合同签署出错，异常信息：" + rsp3203Bean.getRtnMsg());
				}
			}

			if (ElectronicSignatureEnums.RetCodeEnum.SUCCESS.VALUE.equals(retCode)) {
				RspElectronicSignatureDL01Bean rspDL01Bean = null;
				try {
					rspDL01Bean = electronicSignatureService.electronicSignatureDownloadContract(reqCADL01Bean);// 电子签章处理：合同下载
				} catch (Exception e) {
					logErrorInfoVo.setErrorMsg(e.getMessage());// 异常信息
					logErrorInfoVo.setRemark("电子签章处理合同下载出现异常！");// 备注
					logErrorInfoVo.setErrorType(MonAlrmLvlEnum.SERIOUS.getEnname());// 错误级别
					logErrorInfoService.insertLogErrorInfo(logErrorInfoVo);// 记录异常信息
					throw new ESBException("电子签章处理合同下载出现异常：" + e.getMessage());
				}

				if (ElectronicSignatureEnums.RetCodeEnum.SUCCESS.VALUE.equals(rspDL01Bean.getRetStCd())) {// 下载合同成功
					retCode = rspDL01Bean.getRetStCd();// 上传合同签署响应码
					// String imageFilePath = (String) param.get("imageFilePath");// 文件路径
					String conFilePath = (String) param.get("conFilePath");// 文件路径
					String imageFileName = (String) param.get("imageFileName");// 文件名

					// boolean moveFileRes = ZipUtil.moveFile(conFilePath + imageFileName,
					// bakImageFilePath + File.separator + applySeq,
					// imageFileName);// 备份文件
					// logger.info("移动文件，目标路径：" + bakImageFilePath + imageFileName + "，结果[" +
					// moveFileRes + "]");

					logger.info("电子签章处理合同下载成功.....");
					boolean saveResult = strBytesToFileToContractFile(rspDL01Bean.getContrFlStrm(), conFilePath, imageFileName);// 保存合同
					logger.info("保存签章合同，目标路径：" + conFilePath + imageFileName + "，结果[" + saveResult + "]");
				} else {
					logErrorInfoVo.setErrorMsg(rspDL01Bean.getRtnMsg());// 异常信息
					logErrorInfoVo.setRemark("电子签章处理下载合同出现异常！");// 备注
					logErrorInfoVo.setErrorType(MonAlrmLvlEnum.SERIOUS.getEnname());// 错误级别
					logErrorInfoVo.setSerno(UUIDUtil.getUUID());// 主键
					logErrorInfoService.insertLogErrorInfo(logErrorInfoVo);// 记录异常信息
					// 下载合同签署信息响应码
					retCode = ElectronicSignatureEnums.RetCodeEnum.FAILURE.VALUE;
					// 下载合同签署异常信息
					logger.error("电子签章处理下载合同出现异常，异常信息：" + rspDL01Bean.getRtnMsg());
				}
			}
			if (ElectronicSignatureEnums.RetCodeEnum.SUCCESS.VALUE.equals(retCode)) {
				result = true;
			} else {
				result = false;
			}
		} finally {
			
		}
		return result;
	}

	/**
	 * 
	 * 1、并把合同文件转为二进制字符串<br>
	 * 
	 * @param filePath
	 * @param fileName
	 * @return
	 * @date:2018年12月15日 上午11:02:36
	 * @author:ludayong
	 */

	private String contractFileToStrByte(String filePath) {
		File file = new File(filePath);
		String fileStr = null;
		byte[] fileBytes = null;
		try {
			fileBytes = FileUtil.toByteArray(file);
		} catch (IOException e) {
			logger.error("合同文件转字节数组出现异常，异常信息" + e.getMessage());
			e.printStackTrace();
		}
		fileStr = Base64.encodeBytes(fileBytes);
		return fileStr;
	}

	/**
	 * 
	 * 1、把二进制文件字符串转为文件<br>
	 * 
	 * @param fileBinStr
	 * @param fileName
	 * @return
	 * @date:2018年12月15日 上午11:02:36
	 * @author:ludayong
	 */

	private boolean strBytesToFileToContractFile(String fileBytStr, String filePath, String fileName) {
		boolean result = false;
		try {
			byte[] newBytes = Base64.decode(fileBytStr);
			FileUtil.writeBytesToFile(newBytes, filePath, fileName);
			result = true;
		} catch (IOException e) {
			logger.error("字节数组转合同文件出现异常，异常信息" + e.getMessage());
			e.printStackTrace();
		}
		return result;
	}

	/**
	 *
	 * 1、设置签章cfca加签信息<br>
	 *
	 * @param inCfcaSignInfoVO
	 * @param prdId
	 * @return
	 * @date:2019年11月15日 上午11:02:36
	 * @author:ludayong
	 */
	private CfcaSignInfoVO setCfcaSignInfo(CfcaSignInfoVO inCfcaSignInfoVO, String prdId){
		// 业务经办人
		inCfcaSignInfoVO.setNlsOperUserid(BaseConstant.ADMIN);
		// 业务经办机构
		if(NlsProdCdEnum.ZXD.getValue().equals(prdId) || NlsProdCdEnum.MYD.getValue().equals(prdId)){
			// 度小满-满易贷，尊享贷产品
			inCfcaSignInfoVO.setNlsOperOrgid(InstitutionEnums.InstitutionEnum.GZYHZHYHZXSCTD1.getCode());
		}else if(NlsProdCdEnum.MS.getValue().equals(prdId)){
			// 马上金融联合贷
			inCfcaSignInfoVO.setNlsOperOrgid(InstitutionEnums.InstitutionEnum.GZYHZHYHZXSCTD2.getCode());
		}
		// 创建人
		inCfcaSignInfoVO.setCreateUser(BaseConstant.ADMIN);
		// 创建时间
		inCfcaSignInfoVO.setCreateTime(DateTool.getCurrentDateTime());
		return inCfcaSignInfoVO;
	}

	/**
	 *
	 * 1、更新cfca加签信息最后修改信息<br>
	 *
	 * @param inCfcaSignInfoVO
	 * @param prdId
	 * @return
	 * @date:2019年11月15日 上午14:32:36
	 * @author:ludayong
	 */
	private CfcaSignInfoVO setCfcaSignInfo(CfcaSignInfoVO inCfcaSignInfoVO){
		// 最后更新人
		inCfcaSignInfoVO.setLastUpdateUser(BaseConstant.ADMIN);
		// 最后更新时间
		inCfcaSignInfoVO.setLastUpdateTime(DateTool.getCurrentDateTime());
		return inCfcaSignInfoVO;
	}


    /**
     * 记录异常信息
     *
     * @param applySeq
     * @param remark
     * @param tableName
     * @param errorType
     * @return
     * @throws Exception
     * @author ludayong
     * @since 2019年1月15日 上午9:23:42
     * @version 1.0
     */
    private void recordLogErrorInfo(String applySeq, String remark, String tableName, String errorType) {
        String currentTime = DateTool.getCurrentDateTime();// 当前时间
        // 错误信息
        LogErrorInfoVO logErrorInfoVo = new LogErrorInfoVO();
        logErrorInfoVo.setSerno(UUIDUtil.getUUID());// 主键
        logErrorInfoVo.setApplySeq(applySeq);
        logErrorInfoVo.setState(ElectronicSignatureEnums.YesNoEnum.NO.VALUE);// 未处理
        logErrorInfoVo.setCreateTime(currentTime);// 创建时间
        logErrorInfoVo.setLastModifyTime(currentTime);// 最后修改时间
        logErrorInfoVo.setTableName(tableName);// 表名
        logErrorInfoVo.setErrorMsg(remark);// 错误信息
        logErrorInfoVo.setRemark(remark);// 备注
        logErrorInfoVo.setErrorType(errorType);// 错误级别
        logErrorInfoService.insertLogErrorInfo(logErrorInfoVo);// 记录错误信息
    }
}
